package com.binarycat.dynamiclimit.limiter.policy;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.springframework.web.method.HandlerMethod;

import com.binarycat.dynamiclimit.DynamicLimiterManager;

/**
 * 抽象的限流策略
 * 
 * @author jjb
 * @date 2018/08/06
 */
public abstract class AbstractLimitPolicy {

    /**
     * 方法(或者方法拼接ip)对应的当前正在起作用的限流策略类名(如:xxx方法已正被CPU限流策略给限流),<br/>
     * 该变量的目的是用来避免同一个方法被不同的限流策略同时影响,从而造成限流阀值更新的紊乱
     */
    protected static final Map<String, String> METHOD_EFFECTIVE_LIMIT_POLICY = new ConcurrentHashMap<>();

    protected DynamicLimiterManager dynamicLimiterManager;

    protected HandlerMethod handlerMethod;

    /**
     * 是否支持该限流策略
     * 
     * @return false:该限流策略将不执行
     */
    public abstract boolean supportLimitPolicy();

    /**
     * 执行该限流策略
     * 
     */
    public abstract void executeLimitPolicy();

    /**
     * 初始化限流策略的基础数据
     * 
     * @param dynamicLimiterManager
     * @param handlerMethod
     */
    public final void initLimitPolicyBaseData(DynamicLimiterManager dynamicLimiterManager,
        HandlerMethod handlerMethod) {
        if(this.dynamicLimiterManager==null) {
            this.dynamicLimiterManager = dynamicLimiterManager;
        }
        if(this.handlerMethod==null) {
            this.handlerMethod = handlerMethod;
        }

    }

}
